package com.zimmor.direct;

import com.rabbitmq.client.*;
import com.zimmor.util.RabbitmqUtil;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Author:zimmor
 * @Date: 2021/12/28 15:58
 * @Description 点对点直连模型的消费者
 * @version: 1.0.0
 */

public class Customer {
    public static void main(String[] args) {
//        //创建连接工厂
//        ConnectionFactory connectionFactory = new ConnectionFactory();
//        //设置主机server
//        connectionFactory.setHost("192.168.204.128");
//        //设置端口
//        connectionFactory.setPort(5672);
//        //设置虚拟主机
//        connectionFactory.setVirtualHost("ems");
//        //设置用户和密码
//        connectionFactory.setUsername("zimmor");
//        connectionFactory.setPassword("123");
        //创建连接对象
        try {
//            Connection connection = connectionFactory.newConnection();
            Connection connection = RabbitmqUtil.getConnection();
            //创建通道
            Channel channel = connection.createChannel();
            //通道绑定队列 消费者这里其实可以不用再次申明的，但是如果消费者比生产者先启动了，
            // 此时这个队列可能不存在就会发生异常，所以为了确保消费者在监听某一队列时这个队列存在，这里再次申明一下
            /*
             *参数解释
             * queue 绑定的队列名称
             * durable 是否持久化
             * exclusive 是否独占
             * autoDelete 是否自动删除
             * arguments 定义的其他配置
             */
            channel.queueDeclare("hello", false, false, false, null);
            //消费队列消息
            /*
             *参数解释
             * queue 要消费的队列
             * autoAck 是否自动确认
             * consumer 消费者对象
             */

            channel.basicConsume("hello", true, new DefaultConsumer(channel) {
                /**
                 *当接收到队列中的消息时给RabbitMQ服务器的一个回调函数
                 * @param consumerTag
                 * @param envelope
                 * @param properties
                 * @param body
                 */
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body){
                    System.out.println("消费hello队列里面的消息为：" + new String(body));
                }
            });
            //因为消费者要长时间监听队列中的消息，所以连接和通道不能关闭
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
